/*******************************************************************************
Autores: 
-Eddy Omar Castro Jauregui - 11032
-Marta Alejandra del Valle Lau - 11053
-Cristian Gustavo Castro Xum - 11129
Seccion: 20
Fecha: octubre de 2011
Nombre del archivo: InterInformatica.java
Breve descripcion: Esta clase se utiliza para el frame que maneja la categoria
de Cuenta Bancaria.
*******************************************************************************/

package proyecto2;

import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

public class InterBancaria extends javax.swing.JFrame {

       
    static ArrayList<CuentaBancaria> nBancaria = new ArrayList();
    CuentaBancaria cuentaTemporal;

    public ArrayList<CuentaBancaria> getnBancaria() {
        return nBancaria;
    }

    public void setnBancaria(ArrayList<CuentaBancaria> nBancaria) {
        InterBancaria.nBancaria = nBancaria;
    }

 
    //CLASE MiModelo: se utiliza para crear una DefaulTableModel, la cual contiene todos los 
    //datos almacenados 
    public class MiModelo extends DefaultTableModel
    {
        @Override
         public boolean isCellEditable (int row, int column)
          {
            if ((column==0)&&((row==0)||(row==1)||(row==2)))
              return false;
            return true;
          }
    }
    
    MiModelo modelo;
    
    
    /** Creates new form InterBancaria */
    public InterBancaria() {
        initComponents();
                    // LLENA COMBOBOX DE LAS CUENTAS EXISTENTES
            for(int i=0; i< nBancaria.size();i++)
            {
               comboBox.addItem(nBancaria.get(i).getTitulo());
            }
            //LISTENER DEL COMBOBOX QUE IDENTIFICA QUE OPCION FUE SELECCIONADO Y ASI MOSTRAR EN LA TABLA 

            comboBox.addActionListener(new ActionListener() { 
            @Override
            public void actionPerformed(ActionEvent arg0) {
                 for(int n=0;n<nBancaria.size();n++)
                 {
                   if(nBancaria.get(n).getTitulo().equals(comboBox.getSelectedItem()))
                     llenarTabla(n);        
                 }                   
               }  
            }); 
            
            setLocationRelativeTo(null);
            // LA SIGUIENTE LINEA DE CODIGO SIRVE PARA QUE NO PUEDAN SER MOVIBLES LAS COLUMNAS 
            jTable1.getTableHeader().setReorderingAllowed(false);
            // SE DESHABILITA AL USUARIO QUE NO PUEDA EDITAR LAS CELDAS INDICADAS  
            modelo = new MiModelo();
            modelo.isCellEditable(0,0);
            modelo.isCellEditable(0,1);
            modelo.isCellEditable(0,2);

            jTable1.setModel(modelo);
            modelo.addColumn("CUENTA BANCARIA",new String[]{"Titulo","Usuario","Banco"});
            modelo.addColumn("VALORES",new String[]{});         
            this.setSize(566, 459);

    }
    // SIRVE PARA LLENAR LA TABLA CON LOS DATOS DE UNA CUENTA ESPECIFICA
    private void llenarTabla(int indice)
    {
       // SE VACIA LA TABLA  
       modelo = new MiModelo();
       jTable1.setModel(modelo);
       modelo.addColumn("CUENTA BANCARIA",new String[]{"Titulo","Usuario","Banco"});
       modelo.addColumn("VALORES",new String[]{}); 
 
       // SE LLENA LA TABLA
       modelo.setValueAt(nBancaria.get(indice).getTitulo(),0,1); 
       modelo.setValueAt(nBancaria.get(indice).getUsuario(),1,1); 
       modelo.setValueAt(nBancaria.get(indice).getBanco(),2,1);
       
       
       if(!nBancaria.get(indice).getCampo().isEmpty())
       {
           Iterator it = nBancaria.get(indice).getCampo().entrySet().iterator();
           int posicion=3;           
           while(it.hasNext())
           {
              Map.Entry  e= (Map.Entry)it.next();               
              modelo.insertRow(modelo.getRowCount(),new Object[]{e.getKey(),e.getValue()});
              posicion++;
           } 
       }
    }
 
    // Método que sirve para saber si un elemento se encuentra en el arraylist de la clase
    // CuentaInformatica, devuelve falso si no está el elemento; y verdadero si está en la lista.
    // tipo boolean
    private boolean estaElemento(String condicion)
    {
        boolean indicador=false;
        for(int i=0;i<nBancaria.size();i++)
        {
            if(nBancaria.get(i).getTitulo().equalsIgnoreCase(condicion))
               indicador=true;
        }
        return indicador;
    }
    
    //Método que sirve para la búsqueda de un índice de un elemento en el arraylist
    //devuelve un entero, tipo int.
    private int busquedaIndice(String condicion)
    {
        int indice=0;
        for(int i=0;i<nBancaria.size();i++)
        {
            if(nBancaria.get(i).getTitulo().equalsIgnoreCase(condicion))
               indice=i;
        }    
        return indice;
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        jLabel2 = new javax.swing.JLabel();
        save = new javax.swing.JLabel();
        regreso = new javax.swing.JLabel();
        botonAgregar = new javax.swing.JLabel();
        comboBox = new javax.swing.JComboBox();
        eliminar = new javax.swing.JLabel();
        registro = new javax.swing.JLabel();

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
        jScrollPane1.setViewportView(jTable1);

        jLabel2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/proyecto2/info.png"))); // NOI18N
        jLabel2.setToolTipText("Información");

        save.setIcon(new javax.swing.ImageIcon(getClass().getResource("/proyecto2/save.png"))); // NOI18N
        save.setToolTipText("Guardar cambios");
        save.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                saveMouseClicked(evt);
            }
        });
        save.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseMoved(java.awt.event.MouseEvent evt) {
                saveMouseMoved(evt);
            }
        });

        regreso.setIcon(new javax.swing.ImageIcon(getClass().getResource("/proyecto2/regresar.png"))); // NOI18N
        regreso.setToolTipText("Regresar al inicio");
        regreso.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                regresoMouseClicked(evt);
            }
        });
        regreso.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseMoved(java.awt.event.MouseEvent evt) {
                regresoMouseMoved(evt);
            }
        });

        botonAgregar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/proyecto2/add.png"))); // NOI18N
        botonAgregar.setToolTipText("Agregar campo");
        botonAgregar.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                botonAgregarMouseClicked(evt);
            }
        });
        botonAgregar.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseMoved(java.awt.event.MouseEvent evt) {
                botonAgregarMouseMoved(evt);
            }
        });

        eliminar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/proyecto2/borrar.png"))); // NOI18N
        eliminar.setToolTipText("Borrar cuenta actual");
        eliminar.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                eliminarMouseClicked(evt);
            }
        });

        registro.setIcon(new javax.swing.ImageIcon(getClass().getResource("/proyecto2/nuevo.png"))); // NOI18N
        registro.setToolTipText("Nueva cuenta informática");
        registro.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                registroMouseClicked(evt);
            }
        });
        registro.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseMoved(java.awt.event.MouseEvent evt) {
                registroMouseMoved(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(106, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(91, 91, 91)
                        .addComponent(comboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 178, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 426, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 43, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 82, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(eliminar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(botonAgregar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(registro)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(save, javax.swing.GroupLayout.PREFERRED_SIZE, 48, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(115, 115, 115))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 421, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(regreso)))
                .addGap(43, 43, 43))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(70, 70, 70)
                .addComponent(comboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(30, 30, 30)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 177, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(eliminar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(botonAgregar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(registro, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(save, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jLabel2))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 48, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGap(66, 66, 66)
                        .addComponent(regreso, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addGap(33, 33, 33))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

private void saveMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_saveMouseClicked
// TODO add your handling code here:
    //BUSCAR HIBERNATE******
    String nombreTitulo=String.valueOf(modelo.getValueAt(0,1));
    cuentaTemporal = new CuentaBancaria();
    HashMap tempHash = new HashMap();
    int i=3,bandera=0;

     // sirve para saber si un elemento no está en la lista  
    if(!estaElemento(nombreTitulo))
    {              
            cuentaTemporal.setTitulo(String.valueOf(modelo.getValueAt(0,1)));
            cuentaTemporal.setUsuario(String.valueOf(modelo.getValueAt(1,1)));    
            cuentaTemporal.setBanco(String.valueOf(modelo.getValueAt(2,1)));

            // ALMACENAMIENTO DE CATEGORIAS EXTRAS
            if(modelo.getRowCount()>3)
            {              
               while(modelo.getRowCount()>i)
               {
                   if((!modelo.getValueAt(i, 0).equals(""))&&(!modelo.getValueAt(i, 1).equals("")))            
                        tempHash.put(modelo.getValueAt(i, 0),modelo.getValueAt(i, 1));    
                   else if((!modelo.getValueAt(i, 0).equals(""))&&(modelo.getValueAt(i, 1).equals("")))
                   {   
                        JOptionPane.showMessageDialog(this,"El campo: "+modelo.getValueAt(i, 0)+" no tiene valor asignado \n Corrija y guarde de nuevo sus cambios","ERROR",JOptionPane.ERROR_MESSAGE);
                        bandera=1;
                   }
                   else if((modelo.getValueAt(i, 0).equals(""))&&(!modelo.getValueAt(i, 1).equals("")))
                   { 
                         JOptionPane.showMessageDialog(this,modelo.getValueAt(i, 1)+" no tiene un campo asignado \n Corrija y guarde de nuevo sus cambios","ERROR",JOptionPane.ERROR_MESSAGE);      
                         bandera=1;
                   }
                   i++;
               }       
               cuentaTemporal.setCampo(tempHash);
            }            
            if (bandera!=1)
            {    
                nBancaria.add(cuentaTemporal);
                JOptionPane.showMessageDialog(this,"CUENTA AGREGADA EXITOSAMENTE","INFORMACION",JOptionPane.INFORMATION_MESSAGE);
            }    
    }
    else
    { 
        nBancaria.get(busquedaIndice(nombreTitulo)).setTitulo(String.valueOf(modelo.getValueAt(0,1)));
        nBancaria.get(busquedaIndice(nombreTitulo)).setUsuario(String.valueOf(modelo.getValueAt(1,1)));   
        nBancaria.get(busquedaIndice(nombreTitulo)).setBanco(String.valueOf(modelo.getValueAt(2,1)));   
            // ALMACENAMIENTO DE CATEGORIAS EXTRAS
        if(modelo.getRowCount()>3)
        {
           nBancaria.get(busquedaIndice(nombreTitulo)).getCampo().clear();
           while(modelo.getRowCount()>i)
           {
               if((!modelo.getValueAt(i, 0).equals(""))&&(!modelo.getValueAt(i, 1).equals("")))
                  nBancaria.get(busquedaIndice(nombreTitulo)).getCampo().put(modelo.getValueAt(i, 0),modelo.getValueAt(i, 1));
               else if((!modelo.getValueAt(i, 0).equals(""))&&(modelo.getValueAt(i, 1).equals("")))
               {   
                    JOptionPane.showMessageDialog(this,"El campo: "+modelo.getValueAt(i, 0)+" no tiene valor asignado \n Corrija y guarde de nuevo sus cambios","ERROR",JOptionPane.ERROR_MESSAGE);
                    bandera=1;
               }
               else if((modelo.getValueAt(i, 0).equals(""))&&(!modelo.getValueAt(i, 1).equals("")))
               { 
                     JOptionPane.showMessageDialog(this,modelo.getValueAt(i, 1)+" no tiene un campo asignado \n Corrija y guarde de nuevo sus cambios","ERROR",JOptionPane.ERROR_MESSAGE);      
                     bandera=1;
               }
               i++;
           } 
        }
        JOptionPane.showMessageDialog(this,"CAMBIOS DE EDICION GUARDADOS EXITOSAMENTE","INFORMACION",JOptionPane.INFORMATION_MESSAGE);
        
    }       
    //ordena el arraylist nBancaria de la A hasta la Z( por titulo )
    Collections.sort(nBancaria);
    comboBox.removeAllItems();
    
    //System.out.print(nBancaria.size());   

    for(int ind=0; ind<nBancaria.size();ind++)
    {
       comboBox.addItem(nBancaria.get(ind).getTitulo());
    }       
    
    //Pruebas de impresion
    
   /* Iterator<CuentaBancaria> x = nBancaria.iterator();
    while(x.hasNext())
    {
        System.out.println(x.next());
    }*/
}//GEN-LAST:event_saveMouseClicked

private void saveMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_saveMouseMoved
// TODO add your handling code here:
    save.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));  
}//GEN-LAST:event_saveMouseMoved

private void regresoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_regresoMouseClicked
// TODO add your handling code here:
    this.setVisible(false);
}//GEN-LAST:event_regresoMouseClicked

private void regresoMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_regresoMouseMoved
// TODO add your handling code here:
    regreso.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));   
}//GEN-LAST:event_regresoMouseMoved

private void botonAgregarMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_botonAgregarMouseClicked
// TODO add your handling code here:
   String nombre = JOptionPane.showInputDialog(null,"Ingrese nombre del nuevo campo","NUEVO CAMPO",JOptionPane.QUESTION_MESSAGE);
   
   if(!nombre.equals(""))
   {    
     modelo.insertRow(modelo.getRowCount(),new Object[]{"",""});
     modelo.setValueAt(nombre, modelo.getRowCount()-1, 0); 
   }
}//GEN-LAST:event_botonAgregarMouseClicked

private void botonAgregarMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_botonAgregarMouseMoved
// TODO add your handling code here:
    botonAgregar.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));  
}//GEN-LAST:event_botonAgregarMouseMoved

private void eliminarMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_eliminarMouseClicked
// TODO add your handling code here:
        String busquedaTitulo = String.valueOf(modelo.getValueAt(0, 1));
        if (estaElemento(busquedaTitulo))
        {
            nBancaria.remove((busquedaIndice(busquedaTitulo)));
            JOptionPane.showMessageDialog(this,"ELMININACION EXITOSA","INFORMACION",JOptionPane.INFORMATION_MESSAGE);
        }
        else
        {
            JOptionPane.showMessageDialog(this,"AUN NO SE ENCUENTRA ESTA CUENTA EN LA CARTERA","INFORMACION",JOptionPane.INFORMATION_MESSAGE);
        }    
        
        Collections.sort(nBancaria);
        comboBox.removeAllItems(); 
        System.out.print(nBancaria.size());
        for(int ind=0; ind<nBancaria.size();ind++)
        {
          comboBox.addItem(nBancaria.get(ind).getTitulo());
        }       
        modelo = new MiModelo();
        jTable1.setModel(modelo);
        modelo.addColumn("CUENTA INFORMATICA",new String[]{"Titulo","Usuario","Contraseña"});
        modelo.addColumn("VALORES",new String[]{});  
 
    
}//GEN-LAST:event_eliminarMouseClicked

private void registroMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_registroMouseClicked
// TODO add your handling code here:
    
        modelo = new MiModelo();
        jTable1.setModel(modelo);
        modelo.addColumn("CUENTA INFORMATICA",new String[]{"Titulo","Usuario","Contraseña"});
        modelo.addColumn("VALORES",new String[]{}); 
}//GEN-LAST:event_registroMouseClicked

private void registroMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_registroMouseMoved
// TODO add your handling code here:
    registro.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));  
}//GEN-LAST:event_registroMouseMoved


    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel botonAgregar;
    private javax.swing.JComboBox comboBox;
    private javax.swing.JLabel eliminar;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    private javax.swing.JLabel registro;
    private javax.swing.JLabel regreso;
    private javax.swing.JLabel save;
    // End of variables declaration//GEN-END:variables
}
